﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Routing;
using System.Web;
using System.Web.Mvc;

namespace Tencent.OA.App
{
    /// <summary>
    ///  定义一个用于生成客户端可用Url的接口。
    /// </summary>
    public interface ISiteMapNodeUrlResolver
    {
        /// <summary>
        /// 使用指定的MvcSiteMapNode对象、Mvc Area名称、控制器名称、操作名称和路由值生成操作方法的完全限定URL。 
        /// </summary>
        /// <param name="mvcSiteMapNode">一个MvcSiteMapNode对象。</param>
        /// <param name="areaName">Areas的名称</param>
        /// <param name="controllerName">控制器的名称。</param>
        /// <param name="actionName">操作方法的名称。</param>
        /// <param name="routeValues">一个包含路由参数的对象。</param>
        /// <returns>操作方法的完全限定 URL。</returns>
        string ResolveUrl(MvcSiteMapNode mvcSiteMapNode, IDictionary<string, object> routeValues);
    }

    /// <summary>
    /// 提供 ISiteMapNodeUrlResolver 接口的默认实现。
    /// </summary>
    public class DefaultSiteMapNodeUrlResolver : ISiteMapNodeUrlResolver
    {
        /// <summary>
        /// 根据指定的MvcSiteMapNode对象、Area名称、控制器名称、操作名称和路由值生成客户端可用的URL。
        /// </summary>
        /// <param name="mvcSiteMapNode">一个MvcSiteMapNode对象。</param>
        /// <param name="areaName">Area名称。</param>
        /// <param name="controllerName">操作名称。</param>
        /// <param name="actionName">控制器名称。</param>
        /// <param name="routeValues">路由值。</param>
        /// <returns>客户端可用的URL。</returns>
        public string ResolveUrl(MvcSiteMapNode mvcSiteMapNode, IDictionary<string, object> routeValues)
        {
            RequestContext ctx;
            if (HttpContext.Current.Handler is MvcHandler)
                ctx = ((MvcHandler)HttpContext.Current.Handler).RequestContext;
            else
                ctx = new RequestContext(new HttpContextWrapper(HttpContext.Current), new RouteData());

            return new UrlHelper(ctx).Action(mvcSiteMapNode.Action, mvcSiteMapNode.Controller, new RouteValueDictionary(routeValues));
        }

        #region ISiteMapNodeUrlResolver 成员

        string ISiteMapNodeUrlResolver.ResolveUrl(MvcSiteMapNode mvcSiteMapNode, IDictionary<string, object> routeValues)
        {
            return this.ResolveUrl(mvcSiteMapNode, routeValues);
        }

        #endregion
    }

}
